#pragma once
#include <string>
#include <vector>
#include <set>
#include <map>

#include "external/cppjieba/Jieba.hpp"
#include "external/simhash/Simhasher.hpp"
#include <tinyxml2.h>

class PageProcessor {
public:
    PageProcessor();
    void process(const std::string& dir);

private:
    // 提取XML文档中的item信息
    void extract_documents(const std::string& dir);
    // 文档去重
    void deduplicate_documents();
    // 生成网页库和网页偏移库
    std::string strip_html_tags(const std::string& html);
    void build_pages_and_offsets(const std::string& pages, const std::string& offsets);
    // 计算海明距离
    int hamming_distance(uint64_t hash1, uint64_t hash2);
    // 计算TF-IDF并生成倒排索引
    void build_inverted_index(const std::string& filename);
    // 加载停用词
    void load_stop_words(const std::string& filename);
    // 读取文件内容
    std::string read_file(const std::string& filename);
    // 解析XML文件并提取文档
    void parse_xml(const std::string& filename);

private:
    struct Document {
        int id;
        std::string link;
        std::string title;
        std::string content;
        uint64_t simhash; // 用于去重
    };

private:
    cppjieba::Jieba m_tokenizer;
    simhash::Simhasher m_hasher;
    std::set<std::string> m_stopWords;
    std::vector<Document> m_documents;
    std::map<std::string, std::map<int, double>> m_invertedIndex;
    int m_currentDocId;    // 当前文档ID计数器
};
